package com.neuedu.aop.advice;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AopAdvice {



//    定义切点  方法名就是切点的id
    @Pointcut("execution(* com.neuedu.aop.service.*.*(..))")
    public void pointcut(){  }


    @Before("pointcut()")
    public void before(){
        System.out.println("使用xml的形式，声明的前置通知");
    }

    @After("pointcut()")
    public void after(){
        System.out.println("使用xml的形式，声明后置的通知 ");
    }











    // 定义了一个切点，想要给Controller的方法进行增强
    @Pointcut("execution(* com.neuedu.aop.controller.*.*(..))")
    public void controllerPointCut(){  }


//    <aop:before
    //前置通知
//    @Before("controllerPointCut()")
//    public void beforeController(){
//        System.out.println("方法即将执行  before");
//    }

//    @After("controllerPointCut()")  //无论是否抛异常都会 执行的
//    public void afterController(){
//        System.out.println("方法即将执行  after");
//    }

    @Around("controllerPointCut()")  //无论是否抛异常都会 执行的
    public void aroundController(ProceedingJoinPoint joinpoint ){
        //手动的控制  切点的执行情况

        //签名
        Signature signature = joinpoint.getSignature();
        Object[] args = joinpoint.getArgs();
        Object target = joinpoint.getTarget();
        Object aThis = joinpoint.getThis();

        try {
            //方法开始执行
            System.out.println("方法即将执行  before");
            joinpoint.proceed();
            System.out.println("方法执行成功了， 类似于after");
        } catch (Throwable e) {
            System.out.println("方法执行失败了， 类似于Throwing");
            throw new RuntimeException(e);
        }

    }


//    @AfterThrowing(value="controllerPointCut()" ,throwing = "ex")
//    public void afterThrowing(Exception ex ){
//
//        System.out.println("方法执行失败了了产生了异常");
//        ex.printStackTrace();
//
//    }



//    正常返回时才执行，出现异常后不执行
    @AfterReturning(value="controllerPointCut()" )
    public void afterReturing(){

        System.out.println("正常返回了，");


    }



}